#ifndef __VEC3_H__
#define __VEC3_H__

namespace libvec
{
  struct vec2;
  struct dvec3;
  struct vec4;
  struct mat3;

  struct vec3
  {
    float x, y, z;

    vec3();
    vec3(dvec3 v);
    vec3(vec4 v);
    vec3(float value);
    vec3(vec2 v, float z);
    vec3(float x, float y, float z);

    float &operator[](int index);

    vec3 operator=(vec3 v);
    vec3 operator=(dvec3 v);
    vec3 operator=(vec4 v);

    bool operator==(vec3 v);
    bool operator!=(vec3 v);

    vec3 &operator+();
    vec3 &operator-();

    vec3 operator+(vec3 v);
    vec3 operator+=(vec3 v);
    vec3 operator-(vec3 v);
    vec3 operator-=(vec3 v);
    vec3 operator*(mat3 m);
    vec3 operator*=(mat3 m);
    vec3 operator*(float scale);
    vec3 operator*=(float scale);
    vec3 operator/(float scale);
    vec3 operator/=(float scale);
  };
}

#endif /* __VEC3_H__ */
